import frappe

def after_install():
    """WMS安装后处理：同步工作空间到ERPNext"""
    print("🚀 WMS应用安装完成")
    try:
        ensure_erpnext_workspace_wms()
        print("✅ 已同步 WMS 工作空间到 ERPNext（wmscopy）")
    except Exception as e:
        print(f"⚠️ 同步到 ERPNext 失败: {str(e)}")

def ensure_erpnext_workspace_wms():
    """将 WMS 的工作空间全量复制到 ERPNext 名下，目标名称为 'wmscopy'
    
    全量覆盖策略：
    - 若 ERPNext(app=erpnext) 下 name=wmscopy 存在：先删除该 Workspace，再重建
    - 若不存在：直接创建
    - 标签与标题强制设为“仓储管理”，图标使用 liabilities
    """
    # 查找源工作空间（app=wms）
    src_name = frappe.db.get_value("Workspace", {"app": "wms"}, "name")
    if not src_name:
        print("ℹ️ 未找到源 WMS 工作空间（app=wms），跳过复制")
        return

    target_name = "wmscopy"
    # 读取源文档
    src = frappe.get_doc("Workspace", src_name)

    # 需要复制/同步的字段清单（避免复制系统字段）
    fields_to_copy = [
        "content", "shortcuts", "links", "charts", "number_cards",
        "icon", "public", "sequence_id"
    ]

    # 如已存在目标或冲突名称，先删除以确保全量覆盖不留残留字段
    for name in [target_name, "仓储管理"]:
        if frappe.db.exists("Workspace", {"name": name, "app": "erpnext"}):
            try:
                frappe.delete_doc("Workspace", name, ignore_permissions=True)
                frappe.db.commit()
                print(f"🗑️ 已删除 ERPNext 下可能冲突的工作空间: {name}")
            except Exception as e:
                print(f"❌ 删除冲突工作空间失败: {name}, 原因: {str(e)}")
                return

    # 重建目标 Workspace（先插入，再强制重命名，避免 autoname 把 name 设成标题）
    data = {k: getattr(src, k, None) for k in fields_to_copy}
    data.update({
        "app": "erpnext",
        "module": "Setup",
        "parent_page": "",
        "label": "仓储管理",
        "title": "仓储管理",
        "icon": "liabilities",
        "public": 1,
        "sequence_id": 6.5
    })

    # 动态设置排序：介于“库存(Inventory)”与“资产(Assets)”之间
    inv_seq = frappe.db.get_value("Workspace", {"app": "erpnext", "label": "库存"}, "sequence_id") or frappe.db.get_value("Workspace", {"app": "erpnext", "label": "Inventory"}, "sequence_id")
    assets_seq = frappe.db.get_value("Workspace", {"app": "erpnext", "label": "资产"}, "sequence_id") or frappe.db.get_value("Workspace", {"app": "erpnext", "label": "Assets"}, "sequence_id")
    seq = 5.5
    try:
        if inv_seq is not None and assets_seq is not None:
            seq = (float(inv_seq) + float(assets_seq)) / 2.0
    except Exception:
        pass
    data["sequence_id"] = 6.5

    doc = frappe.new_doc("Workspace")
    for k, v in data.items():
        setattr(doc, k, v)

    # 插入后如 name 不是 'wmscopy'，则重命名为 'wmscopy'，确保 URL 为 /app/wmscopy
    doc.insert(ignore_permissions=True)
    frappe.db.commit()
    if doc.name != target_name:
        # 极端情况若已存在同名，先删除旧的再重命名
        if frappe.db.exists("Workspace", {"name": target_name, "app": "erpnext"}):
            frappe.delete_doc("Workspace", target_name, ignore_permissions=True)
            frappe.db.commit()
        frappe.rename_doc("Workspace", doc.name, target_name, force=True)
        frappe.db.commit()
    print(f"✅ 已全量重建 ERPNext 工作空间: {target_name}")